minlog

업캐스팅의 유용함

2023.11.10·조회수:
0
thumbnail
 

업캐스팅의 유용함

업캐스팅

특정 객체가 하위 클래스의 형에서 상위의 클래스형으로 캐스팅 되는 것 하나의 매개변수의 형으로 여러 형을 받아줄 수 있다.

[만약 C#이 업캐스팅 문법을 지원하지 않을 때 생기는 문제점]

새로운 하위 클래스를 만들 때 마다 ‘동물병원 클래스’ 안에도 그 하위클래스에 맞는 ‘환자추가 함수’ 를 새로 만들어야 한다.

업캐스팅을 하지 않았을 때 생기는 불편함

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

 // 상위클래스
public class Animal
{

}

public class Dog : Animal
{

}

public class Cat : Animal
{

}

public class Rabbit : Animal
{

}

public class 동물1 : Animal
{

}
public class 동물2 : Animal
{

}
public class 동물3 : Animal
{

}


class 동물병원
{
    public void 진료(Dog ani)
    {
        Console.WriteLine("환자 도착 : " + ani);
    }

    public void 진료(Cat ani)
    {
        Console.WriteLine("환자 도착 : " + ani);
    }

    public void 진료(Rabbit ani)
    {
        Console.WriteLine("환자 도착 : " + ani);
    }
}

class main
{
    public static void Main(string[] args)
    {
        Dog d = new Dog();
        Cat c = new Cat();
        Rabbit r = new Rabbit();

        // 이후 소문듣고 몰려온 새 환자들
        동물1 a1 = new 동물1();
        동물2 a2 = new 동물2();
        동물3 a3 = new 동물3();

        동물병원 hospital = new 동물병원();
        hospital.진료(d);
        hospital.진료(c);
        hospital.진료(r);

        //hospital.진료(a1);
        //hospital.진료(a2);
        //hospital.진료(a3);
    }
}

그래서 열받은 병원장은 업캐스팅을 사용해서 새로운 하위클래스가 추가되더라고 더이상 동물병원 클래스를 고칠 필요가 없도록 수정하였다.


업캐스팅을 한 경우

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

 // 상위클래스
public class Animal
{

}

public class Dog : Animal
{

}

public class Cat : Animal
{

}

public class Rabbit : Animal
{

}

public class 동물1 : Animal
{

}
public class 동물2 : Animal
{

}
public class 동물3 : Animal
{

}


class 동물병원
{
    public void 진료(Animal ani)
    {
        Console.WriteLine("환자 도착 : " + ani);
    }

}

class main
{
    public static void Main(string[] args)
    {
        Dog d = new Dog();
        Cat c = new Cat();
        Rabbit r = new Rabbit();

        // 이후 소문듣고 몰려온 새 환자들
        동물1 a1 = new 동물1();
        동물2 a2 = new 동물2();
        동물3 a3 = new 동물3();

        동물병원 hospital = new 동물병원();
        hospital.진료(d);
        hospital.진료(c);
        hospital.진료(r);

        hospital.진료(a1);
        hospital.진료(a2);
        hospital.진료(a3);
    }
}

인터페이스와 추상클래스의 업캐스팅 차이

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

// 인터페이스
public interface 인터페이스
{
    void 추상함수1(); // abstract를 굳이 안 붙인다 (어차피 100% 추상함수밖에 없으므로)
}

// 추상클래스
public abstract class 추상클래스
{
    // 추상함수
    public abstract void 추상함수2();

    // 일반함수도 존재할 수 있다
}

public class 하위클래스 : 추상클래스, 인터페이스
{
    public void 추상함수1()
    {
        Console.WriteLine("인터페이스에 있던 추상함수");
    }

    public override void 추상함수2()
    {
        Console.WriteLine("추상클래스에 있던 추상함수");
    }
}

public class TestMain
{
    public static void Main(string[] args)
    {
        하위클래스 하위 = new 하위클래스();

        // 1. 인터페이스의 업캐스팅 예시
        인터페이스 up1 = 하위; // 인터페이스 : 상위클래스
        up1.추상함수1();

        // 2. 추상클래스의 업캐스팅 예시
        추상클래스 up2 = 하위; // 추상클래스 : 상위클래스
        up2.추상함수2();

    }
}